package com.bw.controller;

import com.alibaba.fastjson.JSON;
import com.bw.entity.User;
import com.bw.service.UserService;
import org.spring.kun.common.Md5Utils;
import org.spring.kun.common.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.concurrent.TimeUnit;

@Controller
public class LoginController {

    @Autowired
    UserService userService;
    @Autowired
    RedisTemplate redisTemplate;


    @RequestMapping("/loginPage.do")
    public String loginPage() {

        return "login";
    }

    @RequestMapping("/login.do")
    public String login(@Valid User loginUser, BindingResult result, Model model, HttpServletResponse response, HttpServletRequest request) {

        // 非空验证
        if (result.hasErrors()){

            model.addAttribute("error",result.getAllErrors().get(0).getDefaultMessage());

            return "login";
        }

        // 用户名不存在
        User userDB =   userService.selectByName(loginUser.getName());

        if (userDB == null){
            model.addAttribute("error","用户名不存在");
            return "login";
        }

        String password = userDB.getPassword(); // 数据库的密码
        String salt = userDB.getSalt(); //数据库的盐
        String loginUserPassword = loginUser.getPassword(); // 用户输入的密码

        String md5String = Md5Utils.getMD5String(loginUserPassword + salt);

        if (!md5String.equals(password)){

            model.addAttribute("error","密码错误");

            return "login";

        }

        // 颁发令牌  加密用户得到token  把token放入cookie 把cookie返回给浏览器  设置过期时间为30分钟
        TokenUtils.responseTokenByCookie(userDB,response,30);

        // 把用户信息存储到Redis 并且设置过期时间为token的过期时间  30分钟

        redisTemplate.opsForValue().set(userDB.getName(), JSON.toJSONString(userDB),30, TimeUnit.MINUTES);

        return "redirect:list.do";
    }


    @RequestMapping("/list.do")
    public String list(HttpServletRequest request, Model model){

        // 获取当前登录用户
        User userFromRequest = TokenUtils.getLoginUserFromRequest(request, User.class);
        //绑定账号成功 在列表页 展示一下  昵称和头像
        model.addAttribute("nickName",userFromRequest.getNickName());

        model.addAttribute("avatarUrl",userFromRequest.getAvatarUrl());
        return "list";
    }
}
